<?php

class Subscriber extends Admin_Controller {

    public function __construct() {

        parent::__construct();

        $this->load->model(array('subscriber_model', 'subscriber_group_model'));
        
        $this->load->helper('file');

    }
    
	public function index()
	{
		$limit  = 20;
        $offset = _get('per_page', 0);
   		
	   	$group_id = _get('group_id', NULL);
	   	$needle = _get('needle', NULL);
	   	$gender = _get('gender', NULL);
		
		// filtreleme için kullanıcının tüm abone guruplarını çekiyoruz
		$groups = array(NULL => 'Hepsi') + dropdown_fromdb("SELECT id, name FROM _subscriber_group WHERE user_id = {$this->auth->uid()}");
		
		// get subscribers
		if($needle)
		{
			$options = array('group_id' => $group_id, 'gender' => $gender, 'needle' => $needle, 'user_id' => $this->auth->uid());
			$result = $this->subscriber_model->search($options, $limit, $offset);
		}
		else
		{
			$options = array('group_id' => $group_id, 'gender' => $gender, 'user_id' => $this->auth->uid());
			$result = $this->subscriber_model->gets($options, $limit, $offset);
		}

        // statuses
		$statuses = $this->config->item('subscriber', 'statuses');

		// genders
		$genders = array(NULL => 'Hepsi') + $this->config->item('genders');

        // PAGINATION
        $pagination = create_pagination(uri_string()."/?group_id={$group_id}&gender={$gender}&needle={$needle}", $result['total_rows'], $limit);

        // DATA
        $data = array(
            'groups' => $groups,
            'result' => $result,
			'statuses' => $statuses,
			'genders' => $genders,
			'pagination' => $pagination
        );
		
		$this->template->load('subscriber/index', $data);
    }

	public function edit($id) {

        if (empty($_POST)) {

            // subscriber
            $subscriber = $this->subscriber_model->get(array('id' => $id));
			
            // subscriber groups
			$groups = dropdown_fromdb("SELECT id, name FROM _subscriber_group WHERE user_id = {$this->auth->uid()}");
            
            // statuses
            $statuses = $this->config->item('general', 'statuses');
			
			// genders
			$genders = $this->config->item('genders');

            $data = array(
                'subscriber' => $subscriber,
                'groups' => $groups,
				'statuses' => $statuses,
				'genders' => $genders
            );

            $this->template->load_partial('subscriber/edit', $data);
		
		} else {

            // VALIDATION
            $this->load->library('form_validation');
            $this->form_validation->set_rules('subscriber_id', 'Abone ID', 'trim|required|numeric');
            $this->form_validation->set_rules('group_id', 'Gurup ID', 'trim|required|numeric|callback__group_check');
            $this->form_validation->set_rules('address', 'E mail adresi', 'trim|required|xss_clean|valid_email|callback__email_check2');
            $this->form_validation->set_rules('firstname', 'Ad', 'trim|xss_clean|max_length[120]');
            $this->form_validation->set_rules('lastname', 'Soyad', 'trim|xss_clean|max_length[120]');
            $this->form_validation->set_rules('gender', 'Cinsiyet', 'trim|exact_length[1]');

			if (!$this->form_validation->run())
			{
				ajax_response($this->form_validation->error_string());
            }

            // CONTINUE

            $data = array(
                'group_id' => $_POST['group_id'],
                'address' => $this->lowercase($_POST['address']),
                'firstname' => $_POST['firstname'],
				'lastname' => $_POST['lastname'],
				'gender' => $this->input->post('gender')
            );

            $this->subscriber_model->edit($data, array('id' => $_POST['subscriber_id'], 'user_id' => $this->auth->uid()));

			ajax_response('İşlem tamamlandı', FALSE);
        }

    }

	public function delete($group_id, $id)
	{
        $options = array(
            'id' => $id,
            'group_id' => $group_id,
            'user_id' => $this->auth->uid()
        );

        $this->subscriber_model->delete($options);

		set_notify('İşlem tamamlandı.');

        redirect($this->input->server('HTTP_REFERER'));
    }

    /* CALLBACK FUNCTIONS */

    /**
     * Kullanıcının farklı bir kullanıcının gurubuna veya olmayan bir guruba abone eklemesine karşı
     * söz konusu gurubun gerçekten var olduğu ve kullanıcıya ait olup olmadığını kontrol eder.
     *
     * @param int $group_id
     * @return bool
     */
	public function _group_check($group_id)
	{
    	$result = $this->db->where(array('id' => $group_id, 'user_id' => $this->auth->uid()))->count_all_results('subscriber_group');

		if (!$result)
		{
            $this->form_validation->set_message('_group_check', 'Böyle bir gurup yok!');
            return false;
        }

        return true;
    }

    /**
     * Abonenin gurupta zaten mevcut olup olmadığını kontrol eder.
     *
     * @param string $email
     * @return bool
     */
    public function _email_check($email) {

        $options = array(
            'where' => array('address' => $email, 'group_id' => $_POST['group_id'])
        );
        $result = $this->subscriber_model->has($options);

        if ($result) {
            $this->form_validation->set_message('_email_check', 'Bu adres bu listede zaten mevcut.');
            return false;
        }

        return true;

    }

    /**
     * Abonenin gurupta zaten mevcut olup olmadığını kontrol eder.
     * Abone düzenlemede kullanılıyor.
     *
     * @param string $email
     * @return bool
     */
	public function _email_check2($email)
	{
    	$result = $this->db->where(array('address' => $email, 'group_id' => $_POST['group_id'], 'id <>' => $_POST['subscriber_id']))->count_all_results('subscriber');

        if ($result) {
            $this->form_validation->set_message('_email_check2', 'Bu adres bu gurupta zaten mevcut.');
            return false;
        }

        return true;
    }

    /* HELPER METHODS */

    /**
     * Kendisine verilen karekterleri küçük harfe dönüştürür.
     * Genelde mail eklemelerinde kullanılıyor.
     *
     * @param string $str
     * @return string
     */
    private function lowercase($str) {

        return mb_strtolower($str, 'UTF-8');

    }

}

/* End of file subscriber.php */
